package com.xjh.basestudy.designmode.structureMode.structureMode4_Adapter;

/**
 * @author XuJianHua
 * @date 2022-09-26 09:38:34
 * @description 直接接三相接口会报错
 * 问题：java中实现类实现了接口，创建对象为什么要写成
 * 接口 对象名 = new 类名（只能调用接口中有的方法，而不能调用类中特有的方法。）
 * 而不是 子类对象 对象名 = new 类名？（方式创建出来的对象可以调用所有的方法）
 * 答案：
 * 应该优先使用接口而不是类来引用对象，但只有存在适当的接口类型时。
 * 使用接口类去引用对象是有前提条件的—实现类中全是接口类的方法的实现，没有自己单独的方法。
 * 当实现类存在自己的方法时（一般都没有），使用实现类来声明变量。
 * <p>
 * * * *
 * 1.  public class Client {
 * 2.
 * 3.      public static void main(String[] args) {
 * 4.          //TriplePin triplePinDevice = new TV(); //接口不兼容，此处报错“类型不匹配”
 * 5.          DualPin dualPinDevice = new TV();//构造两插电视机
 * 6.          TriplePin triplePinDevice = new Adapter(dualPinDevice);//适配器接驳两端
 * 7.          triplePinDevice.electrify(1, 0, -1);//此处调用的是三插通电标准
 * 8.          //输出结果：
 * 9.          //火线通电：1，零线通电：0
 * 10.         //电视开机
 * 11.     }
 * 12.
 * 13. }*
 */
public class Client {

    public static void main(String[] args) {
        // 1. 不使用适配器的情况下，由于电视只实现了两相插孔，所以无法使用墙上的三相插孔
        //接口不兼容，此处报错“类型不匹配”
        // TriplePin triplePinDevice = new TV();
        // 知识点：创建对象时，除了可以创建该对象类型的对象，还可以创建该对象类型实现的接口的类型的对象，
        // 后者是更好的操作，假如该接口还被对象二实现，那么创建对象二时，可以直接 对象一生成的引用 = new 对象2（）；
        // 这样的好处和意义是什么？见注释

        /**需要注意的是，适配器并不关心接入的设备是电视机、洗衣机还是电冰箱，只要是两相插头的设备均可以进行适配，所以说它是一种通用的适配器。*/
        // 2.使用通用适配器
        // 构造电视机对象，有一个两相插孔
        // 接着给构造好的适配器注入电视机对象（将电视机两相插头插入适配器），并将其赋给三相插孔接口（将匹配好的适配器插入墙上的三相插孔）。
        // 最后，我们直接调用三插通电方法给电视机供电，
        DualPin dualPinDevice = new TV();
        TriplePin triplePinDevice = new Adapter(dualPinDevice);//适配器接驳两端
        triplePinDevice.electrify(1, 0, -1);//此处调用的是三插通电标准

        //输出结果：
        //火线通电：1，零线通电：0
        //电视开机
        // 使用专属适配器
        TriplePin tvAdapter = new TVAdapter();
        tvAdapter.electrify(1, 0, -1);

    }

}